namespace cpputils
{

template<class T>
struct nullable_value
{
	T value;
	bool is_null;

	nullable_value()
		: is_null(true)
	{
	}
	nullable_value(const T& Val)
		: value(Val), is_null(false)
	{
	}
	nullable_value& operator=(const T& Val)
	{
		value = Val;
		is_null = false;
		return *this;
	}
	operator const T&() const
	{
		assert(!is_null);
		return value;
	};
	operator T&()
	{
		assert(!is_null);
		return value;
	}
};

template<class T>
struct checked_nullable_value : public nullable_value<T>
{
	checked_nullable_value()
	{
	}
	checked_nullable_value(const T& Val)
		: nullable_value<T>(Val)
	{
	}
	checked_nullable_value(const nullable_value<T>& Val)
		: nullable_value<T>(Val)
	{
	}
	checked_nullable_value& operator=(const nullable_value<T>& Val)
	{
		(nullable_value<T>&)*this = Val;
		return *this;
	}
	operator const T&() const
	{
		if (this->is_null) throw runtime_error("Cannot get null value");
		return this->value;
	};
	operator T&()
	{
		if (this->is_null) throw runtime_error("Cannot get null value");
		return this->value;
	}
};

}
